package com.york.tinyrpc.protoss.registry.center;

import com.york.tinyrpc.protoss.config.RegistryCenterConfig;
import com.york.tinyrpc.protoss.model.ServiceMetaInfo;

import java.util.List;

/**
 * 定义注册中心的功能接口
 * 各类注册中心的实现者需要实现这些功能，完成对想要注册到该中心的服务的操作
 */
public interface RegistryCenter {

    /**
     * 初始化
     *
     * @param registryCenterConfig
     */
    void registryCenterInit(RegistryCenterConfig registryCenterConfig);

    /**
     * 注册服务（服务端）
     *
     * @param serviceMetaInfo
     */
    void serviceRegister(ServiceMetaInfo serviceMetaInfo) throws Exception;

    /**
     * 注销服务（服务端）
     *
     * @param serviceMetaInfo
     */
    void removeServiceRegister(ServiceMetaInfo serviceMetaInfo);

    /**
     * 服务发现（获取某服务的所有节点，消费端）
     *
     * @param serviceKey 服务键名
     * @return
     */
    List<ServiceMetaInfo> serviceDiscovery(String serviceKey);

    /**
     * 注册中心销毁（下线）
     */
    void destroyRegistryCenter();

    /**
     * 心跳检测机制
     * 实际作用是续签，只要提供方的接口不下线，且在过期前通过续签，则重写该注册信息的过期时间
     */
    void refreshToken();

    /**
     * 服务消费方监听【服务键名】的服务状态，动态刷新服务列表缓存
     *
     * @param serviceKey 服务节点键名
     */
    void watchServiceStateByKey(String serviceKey);
}
